package haoji_juc;

import javax.lang.model.SourceVersion;
import java.util.concurrent.CountDownLatch;

/**
 * @program: Dome
 * @description: 闭锁
 * @className: TestCountDownLatch
 * @author: rjt99999
 * @version: 1.0.0
 * @create: 2020-08-03 17:37
 **/
public class TestCountDownLatch {

    /* 同步工具类

    闭锁，在完成某些运算时，只有其他所有线程的运算全部完成，当前运算才继续执行
Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。
CountDownLatch 一个同步辅助类，在完成一组正在其他线程中执行的操作之前，它允许一个或多个线程一直等待。
闭锁可以延迟线程的进度直到其到达终止状态，闭锁可以用来确保某些活动直到其他活动都完成才继续执行：
确保某个计算在其需要的所有资源都被初始化之后才继续执行;
确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
等待直到某个操作所有参与者都准备就绪再继续执行。


     */

    public static void main(String[] args) {

        /**
         * 方法
         *  void await()
         *  public boolean await(long timeout, TimeUnit unit)


         */

        //用法一
        CountDownLatch countDownLatch = new CountDownLatch(10);//计数器 线程的数量，


        for (int i = 0; i <10 ; i++) {

            new Thread(() -> {


                System.out.println(Thread.currentThread().getName() + "： 0.0");


                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {

                    countDownLatch.countDown();//每完成一次 计算器减一 --放到线程里
                }




            }).start();
        }



        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();

        }
        System.out.println("等待其他线程完成");

        System.out.println("main线程进行了");

    }


}
